home *** CD-ROM | disk | FTP | other *** search
/ Revista CD Expert 8 / Revista CD Expert nº 08 CD1.iso / Utilitarios / Programacao / Pacific C for DOS / EXAMPLES / KEYRATE.C < prev    next >
C/C++ Source or Header  |  1995-03-08  |  2KB  |  119 lines

  1. #include    <stdio.h>
  2. #include    <conio.h>
  3. #include    <stdlib.h>
  4. #include    <intrpt.h>
  5.  
  6. /*
  7.  *    program to set key repeat rate on PC/AT type keyboard
  8.  *    C.Weaver, Oct '91
  9.  */
  10.  
  11. port unsigned char    kb_data @ 0x60;
  12. port unsigned char    kb_status @ 0x64;
  13.  
  14. int
  15. sendbyte(unsigned char data)
  16. {
  17.     int    rcode;
  18.     register int    retry;
  19.     register int    loop;
  20.  
  21.     rcode = 1;
  22.     di();
  23.     for (retry = 0; retry != 8; retry++) {
  24.         for (loop = 0; loop != 0x7FFF; loop++)
  25.             if (!(kb_status & 2))
  26.                 break;
  27.         kb_data = data;
  28.         for (loop = 0; loop != 0x7FFF; loop++)
  29.             if (kb_status & 1)
  30.                 break;
  31.         if (kb_data == 0xFA)
  32.             goto done;
  33.     }
  34.     rcode = 0;
  35. done:
  36.     ei();
  37.     return rcode;
  38. }
  39.  
  40. int
  41. kbdsend(unsigned char data)
  42. {
  43.     if (!sendbyte(0xF3))
  44.         return 0;
  45.     return sendbyte(data);
  46. }
  47.  
  48. void
  49. help(void)
  50. {
  51.     cputs("keyrate: usage: keyrate delay reprate\n\n"
  52.     "delay (before repeat) values:\n"
  53.     "1 = 1/4 sec, 2 = 1/2 sec, 3 = 3/4 sec, 4 = 1 sec\n\n"
  54.     "reprate (repeats per second) values:\n"
  55.     "2, 3, 4, 5, 6, 8, 10, 12, 15, 16, 20, 24, 30\n");
  56.     exit(1);
  57. }
  58.  
  59. main(argc, argv)
  60. int    argc;
  61. char **    argv;
  62. {
  63.     int        delay, reprate;
  64.  
  65.     if (argc != 3)
  66.         help();
  67.     delay = atoi(argv[1]);
  68.     if (delay < 1 || delay > 4)
  69.         help();
  70.     reprate = atoi(argv[2]);
  71.     switch (reprate) {
  72.     case 2:
  73.         reprate = 0x1F;
  74.         break;
  75.     case 3:
  76.         reprate = 0x1A;
  77.         break;
  78.     case 4:
  79.         reprate = 0x17;
  80.         break;
  81.     case 5:
  82.         reprate = 0x14;
  83.         break;
  84.     case 6:
  85.         reprate = 0x12;
  86.         break;
  87.     case 8:
  88.         reprate = 0x0F;
  89.         break;
  90.     case 10:
  91.         reprate = 0x0C;
  92.         break;
  93.     case 12:
  94.         reprate = 0x0A;
  95.         break;
  96.     case 15:
  97.         reprate = 0x08;
  98.         break;
  99.     case 16:
  100.         reprate = 0x03;
  101.         break;
  102.     case 20:
  103.         reprate = 0x04;
  104.         break;
  105.     case 24:
  106.         reprate = 0x02;
  107.         break;
  108.     case 30:
  109.         reprate = 0x00;
  110.         break;
  111.     default:
  112.         help();
  113.     }
  114.     if (kbdsend(((delay - 1) << 5) | reprate))
  115.         cputs("keyrate: keyboard repeat rate set\n");
  116.     else
  117.         cputs("keyrate: couldn't talk to keyboard\n");
  118. }
  119.